package facade.Curso;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dao.implementations.postgresql.Alumno.AlumnoDB;
import dao.implementations.postgresql.Curso.CursoDB;
import dao.interfaces.Alumno.IAlumno;
import dao.interfaces.Curso.ICurso;
import dao.transferObjects.UsuarioTO;
import dao.transferObjects.Gae.AlumnoTO;
import dao.transferObjects.Gae.CursoTO;
import facade.FacadeBase;

public class FacadeCurso extends FacadeBase {
	
	public int crearCurso(CursoTO curso)
	{
		int resp = -1;
		int id_curso;
		this.connection.setAutoCommit(false);
		
		ICurso cursoDB = new CursoDB(this.connection.getConnection());
		IAlumno alumnoDB = new AlumnoDB(this.connection.getConnection());
		
		id_curso = cursoDB.obtenerSgteIDCurso();
		curso.setId_curso(id_curso);
		
		resp = cursoDB.crearCurso(curso);
		
		for(int i=0;i<curso.getListaAlumnos().size();i++)
		{
			//Con esto comprabamos que cada insercion sea satisfactoria
			//En caso de un error hacemos un rollback
			if(resp < 1){
				resp = -1;
				break;
			}
			
			curso.getListaAlumnos().get(i).setId_curso(id_curso);
			//resp = cursoDB.crearAlumnoCurso(curso.getListaAlumnos().get(i));
			resp = alumnoDB.crearAlumnoCurso(curso.getListaAlumnos().get(i));
		}
		
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		
		return resp;
	}
	
	public int modificarCurso(CursoTO curso)
	{
		int resp = -1;
		this.connection.setAutoCommit(false);
		
		ICurso cursoDB = new CursoDB(this.connection.getConnection());
		
		resp = cursoDB.modificarCurso(curso);
		
		/*
		//Con esto comprabamos que cada insercion sea satisfactoria
		//En caso de un error hacemos un rollback
		if(resp > -1){
			
			//Eliminamos los alumnos del curso para luego ingresar los nuevos alumnos
			resp = cursoDB.eliminarAlumnosCurso(curso);
			
			if(resp > 0){
				for(int i=0;i<curso.getListaAlumnos().size();i++)
				{	
					//Con esto comprabamos que cada insercion sea satisfactoria
					//En caso de un error hacemos un rollback
					if(resp < 1){
						resp = -1;
						break;
					}
					curso.getListaAlumnos().get(i).setId_curso(curso.getId_curso());
					resp = cursoDB.crearAlumnoCurso(curso.getListaAlumnos().get(i));
				}
			}
			else{
				resp = -1;
			}
		}
		else{
			resp = -1;
		}
		*/
		
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		
		return resp;
	}
	
	public int eliminarCurso(CursoTO curso)
	{
		int resp = -1;
		this.connection.setAutoCommit(false);
		
		ICurso cursoDB = new CursoDB(this.connection.getConnection());
		IAlumno alumnoDB = new AlumnoDB(this.connection.getConnection());
		
		resp = alumnoDB.eliminarAlumnosCurso(curso);
		
		if(resp > 0)
			resp = cursoDB.eliminarCurso(curso); 
		
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return resp;
	}
	
	public List<CursoTO> obtenerTodosCurso()
	{
		List<CursoTO> listaCurso = new ArrayList<CursoTO>();
		
		ICurso cursoDB = new CursoDB(this.connection.getConnection());
		
		listaCurso = cursoDB.obtenerTodosCurso();
		
		this.closeConnection();
		
		return listaCurso;
	}
	
	public List<CursoTO> obtenerTodosCursoDocente(UsuarioTO usuario)
	{
		List<CursoTO> listaCurso = new ArrayList<CursoTO>();
		
		ICurso cursoDB = new CursoDB(this.connection.getConnection());
		
		listaCurso = cursoDB.obtenerTodosCursoDocente(usuario);
		
		this.closeConnection();
		
		return listaCurso;
	}
	
	public List<AlumnoTO> obtenerAlumnosCurso(CursoTO curso)
	{
		List<AlumnoTO> alumnosCurso = new ArrayList<AlumnoTO>();
		
		IAlumno alumnoDB = new AlumnoDB(this.connection.getConnection());
		
		alumnosCurso = alumnoDB.obtenerAlumnosCurso(curso);
		
		this.closeConnection();		
		return alumnosCurso;
	}
	
	public List<CursoTO> obtenerCursoDocenteAnio(UsuarioTO usuario, int anio)
	{
		List<CursoTO> listaCurso = new ArrayList<CursoTO>();
		
		ICurso cursoDB = new CursoDB(this.connection.getConnection());
		
		listaCurso = cursoDB.obtenerCursoDocenteAnio(usuario,anio);
		
		this.closeConnection();
		
		return listaCurso;
	}
	
}
